.text
.section .rodata
.align 8
.LC38:
	.string	" YEAR RAINFALL (inches)"
.LC39:
	.string	"%5d %15.1f\n"
	.align 8
.LC41:
	.string	"\nThe yearly average is %.1f inches.\n\n"
.LC42:
	.string	"MONTHLY AVERAGES:\n"
	.align 8
.LC43:
	.string	" Jan Feb Mar Apr May Jun Jul Aug Sep Oct "
.LC44:
	.string	" Nov Dec"
.LC45:
	.string	"%4.1f "

.section .rodata
.LC0:
	.long	1082759578
	.align 4
.LC1:
	.long	1077936128
	.align 4
.LC2:
	.long	1073741824
	.align 4
.LC3:
	.long	1067030938
	.align 4
.LC4:
	.long	1045220557
	.align 4
.LC5:
	.long	1053609165
	.align 4
.LC6:
	.long	1075419546
	.align 4
.LC7:
	.long	1080033280
	.align 4
.LC8:
	.long	1087583027
	.align 4
.LC9:
	.long	1091043328
	.align 4
.LC10:
	.long	1090728755
	.align 4
.LC11:
	.long	1070386381
	.align 4
.LC13:
	.long	1084647014
	.align 4
.LC14:
	.long	1063675494
	.align 4
.LC15:
	.long	1050253722
	.align 4
.LC16:
	.long	1068708659
	.align 4
.LC17:
	.long	1089051034
	.align 4
.LC18:
	.long	1091672474
	.align 4
.LC19:
	.long	1087792742
	.align 4
.LC20:
	.long	1074161254
	.align 4
.LC21:
	.long	1061997773
	.align 4
.LC22:
	.long	1066192077
	.align 4
.LC23:
	.long	1075000115
	.align 4
.LC24:
	.long	1086534451
	.align 4
.LC25:
	.long	1090938470
	.align 4
.LC26:
	.long	1088841318
	.align 4
.LC27:
	.long	1092511334
	.align 4
.LC28:
	.long	1079194419
	.align 4
.LC29:
	.long	1058642330
	.align 4
.LC30:
	.long	1071225242
	.align 4
.LC31:
	.long	1086744166
	.align 4
.LC32:
	.long	1089680179
	.align 4
.LC33:
	.long	1085485875
	.align 4
.LC34:
	.long	1081291571
	.align 4
.LC35:
	.long	1077097267
	.align 4
.LC36:
	.long	1067869798
	.align 4
.LC37:
	.long	1076258406
	.align 4
.LC40:
	.long	1084227584

.text
.globl main
.type main, @function
main:
    pushq %rbp
    movq %rsp, %rbp

    // 5 * 12 * 4 + 2 * sizeof(int) + 2 * sizeof(float) = 256
    subq $256, %rsp

    // 4.3
    // 4.3 = 100.0100110011001100110011...
    // 4.3的浮点数表示是：符号位(0) + [小数点左移位数2 + 偏置127 = 129](10000001) + 尾数(00010011001100110011010)，注意因为最后一位下一位是1故需要进一
    // 所以float的4.3 = 01000000100010011001100110011010 = 1082759578(10进制)
    movss	.LC0(%rip), %xmm0
	movss	%xmm0, -256(%rbp)
	movss	.LC0(%rip), %xmm0
	movss	%xmm0, -252(%rbp)
	movss	.LC0(%rip), %xmm0
	movss	%xmm0, -248(%rbp)
    // 3.0
	movss	.LC1(%rip), %xmm0
	movss	%xmm0, -244(%rbp)
    // 2.0
	movss	.LC2(%rip), %xmm0
	movss	%xmm0, -240(%rbp)
    // 1.2
	movss	.LC3(%rip), %xmm0
	movss	%xmm0, -236(%rbp)
    // 0.2
	movss	.LC4(%rip), %xmm0
	movss	%xmm0, -232(%rbp)
	movss	.LC4(%rip), %xmm0
	movss	%xmm0, -228(%rbp)
    // 0.4
	movss	.LC5(%rip), %xmm0
	movss	%xmm0, -224(%rbp)
    // 2.4
	movss	.LC6(%rip), %xmm0
	movss	%xmm0, -220(%rbp)
    // 3.5
	movss	.LC7(%rip), %xmm0
	movss	%xmm0, -216(%rbp)
    // 6.6
	movss	.LC8(%rip), %xmm0
	movss	%xmm0, -212(%rbp)
    // 8.5
	movss	.LC9(%rip), %xmm0
	movss	%xmm0, -208(%rbp)
    // 8.2
	movss	.LC10(%rip), %xmm0
	movss	%xmm0, -204(%rbp)
    // 1.2
	movss	.LC3(%rip), %xmm0
	movss	%xmm0, -200(%rbp)
    // 1.6
	movss	.LC11(%rip), %xmm0
	movss	%xmm0, -196(%rbp)
    // 2.4
	movss	.LC6(%rip), %xmm0
	movss	%xmm0, -192(%rbp)
	pxor	%xmm0, %xmm0
	movss	%xmm0, -188(%rbp)
    // 5.2
	movss	.LC13(%rip), %xmm0
	movss	%xmm0, -184(%rbp)
    // 0.9
	movss	.LC14(%rip), %xmm0
	movss	%xmm0, -180(%rbp)
    // 0.3
	movss	.LC15(%rip), %xmm0
	movss	%xmm0, -176(%rbp)
    // 0.9
	movss	.LC14(%rip), %xmm0
	movss	%xmm0, -172(%rbp)
    // 1.4
	movss	.LC16(%rip), %xmm0
	movss	%xmm0, -168(%rbp)
    // 7.3
	movss	.LC17(%rip), %xmm0
	movss	%xmm0, -164(%rbp)
    // 9.1
	movss	.LC18(%rip), %xmm0
	movss	%xmm0, -160(%rbp)
    // 8.5
	movss	.LC9(%rip), %xmm0
	movss	%xmm0, -156(%rbp)
    // 6.7
	movss	.LC19(%rip), %xmm0
	movss	%xmm0, -152(%rbp)
    // 4.3
	movss	.LC0(%rip), %xmm0
	movss	%xmm0, -148(%rbp)
    // 2.1
	movss	.LC20(%rip), %xmm0
	movss	%xmm0, -144(%rbp)
    // 0.8
	movss	.LC21(%rip), %xmm0
	movss	%xmm0, -140(%rbp)
    // 0.2
	movss	.LC4(%rip), %xmm0
	movss	%xmm0, -136(%rbp)
	movss	.LC4(%rip), %xmm0
	movss	%xmm0, -132(%rbp)
    // 1.1
	movss	.LC22(%rip), %xmm0
	movss	%xmm0, -128(%rbp)
    // 2.3
	movss	.LC23(%rip), %xmm0
	movss	%xmm0, -124(%rbp)
    // 6.1
	movss	.LC24(%rip), %xmm0
	movss	%xmm0, -120(%rbp)
    // 8.4
	movss	.LC25(%rip), %xmm0
	movss	%xmm0, -116(%rbp)
    // 7.2
	movss	.LC26(%rip), %xmm0
	movss	%xmm0, -112(%rbp)
    // 9.9
	movss	.LC27(%rip), %xmm0
	movss	%xmm0, -108(%rbp)
    // 8.4
	movss	.LC25(%rip), %xmm0
	movss	%xmm0, -104(%rbp)
    // 3.3
	movss	.LC28(%rip), %xmm0
	movss	%xmm0, -100(%rbp)
    // 1.2
	movss	.LC3(%rip), %xmm0
	movss	%xmm0, -96(%rbp)
    // 0.8
	movss	.LC21(%rip), %xmm0
	movss	%xmm0, -92(%rbp)
    // 0.4
	movss	.LC5(%rip), %xmm0
	movss	%xmm0, -88(%rbp)
    // 0
	pxor	%xmm0, %xmm0
	movss	%xmm0, -84(%rbp)
    // 0.6
	movss	.LC29(%rip), %xmm0
	movss	%xmm0, -80(%rbp)
    // 1.7
	movss	.LC30(%rip), %xmm0
	movss	%xmm0, -76(%rbp)
    // 4.3
	movss	.LC0(%rip), %xmm0
	movss	%xmm0, -72(%rbp)
    // 6.2
	movss	.LC31(%rip), %xmm0
	movss	%xmm0, -68(%rbp)
    // 7.6
	movss	.LC32(%rip), %xmm0
	movss	%xmm0, -64(%rbp)
    // 5.6
	movss	.LC33(%rip), %xmm0
	movss	%xmm0, -60(%rbp)
    // 3.8
	movss	.LC34(%rip), %xmm0
	movss	%xmm0, -56(%rbp)
    // 2.8
	movss	.LC35(%rip), %xmm0
	movss	%xmm0, -52(%rbp)
    // 3.8
	movss	.LC34(%rip), %xmm0
	movss	%xmm0, -48(%rbp)
    // 0.2
	movss	.LC4(%rip), %xmm0
	movss	%xmm0, -44(%rbp)
    // 0
	pxor	%xmm0, %xmm0
	movss	%xmm0, -40(%rbp)
    // 0
	pxor	%xmm0, %xmm0
	movss	%xmm0, -36(%rbp)
    // 0
	pxor	%xmm0, %xmm0
	movss	%xmm0, -32(%rbp)
    // 1.3
	movss	.LC36(%rip), %xmm0
	movss	%xmm0, -28(%rbp)
    // 2.6
	movss	.LC37(%rip), %xmm0
	movss	%xmm0, -24(%rbp)
    // 5.2
	movss	.LC13(%rip), %xmm0
	movss	%xmm0, -20(%rbp)

    // printf
	leaq	.LC38(%rip), %rax
	movq	%rax, %rdi
	call	puts

    // year
    movl $0, -16(%rbp)
    pxor %xmm0, %xmm0
    // total
    movss %xmm0, -12(%rbp)
    jmp .L2
.L1:
    // month
    movl $0, -8(%rbp)
    pxor %xmm0, %xmm0
    // subtot
    movss %xmm0, -4(%rbp)
    jmp .L4
.L3:
    movl -16(%rbp) /* year */, %eax
    cltq
    imulq $48, %rax
    leaq -256(%rbp), %rdx
    addq %rax, %rdx
    movl -8(%rbp) /* month */, %eax
    cltq
    movss (%rdx, %rax, 4), %xmm0
    movss -4(%rbp) /* subtot*/, %xmm1
    addss %xmm0, %xmm1
    movss %xmm1, -4(%rbp) /* subtot*/
    movl -8(%rbp) /* month */, %eax
    incl %eax
    movl %eax, -8(%rbp) /* month */
.L4:
    movl -8(%rbp) /* month */, %eax
    cmpl $12, %eax
    jl .L3

    movl -16(%rbp) /* year */, %esi
    addl $2010, %esi
    cvtss2sd -4(%rbp) /* subtot*/, %xmm0
    leaq .LC39(%rip), %rdi
    movl $1, %eax
    call printf

    movss -4(%rbp) /* subtot*/, %xmm0
    movss -12(%rbp) /* total */, %xmm1
    addss %xmm1, %xmm0
    movss %xmm0, -12(%rbp) /* total */

    movl -16(%rbp) /* year */, %eax
    incl %eax
    movl %eax, -16(%rbp) /* year */
.L2:
    movl -16(%rbp) /* year */, %eax
    cmpl $5, %eax
    jl .L1

    movss -12(%rbp) /* total */, %xmm0
    movss .LC40(%rip), %xmm1
    divss %xmm1, %xmm0
    cvtss2sd %xmm0, %xmm0
    leaq .LC41(%rip), %rdi
    movl $1, %eax
    call printf

    leaq .LC42(%rip), %rdi
    call puts

    leaq .LC43(%rip), %rdi
    movl $0, %eax
    call printf

    leaq .LC44(%rip), %rdi
    call puts

    movl $0, -8(%rbp) /* month */
    jmp .L6
.L5:
    movl $0, -16(%rbp) /* year */
    pxor %xmm0, %xmm0
    movss %xmm0, -4(%rbp) /* subtot*/
    jmp .L8
.L7:
    movl -16(%rbp) /* year */, %eax
    cltq
    imulq $48, %rax
    leaq -256(%rbp, %rax, 1), %rdx
    movl -8(%rbp) /* month */, %eax
    cltq
    movss (%rdx, %rax, 4), %xmm0
    movss -4(%rbp) /* subtot*/, %xmm1
    addss %xmm1, %xmm0
    movss %xmm0, -4(%rbp) /* subtot*/
    movl -16(%rbp) /* year */, %eax
    incl %eax
    movl %eax, -16(%rbp) /* year */
.L8:
    movl -16(%rbp) /* year */, %eax
    cmpl $5, %eax
    jl .L7

    movss -4(%rbp) /* subtot*/, %xmm0
    movss .LC40(%rip), %xmm1
    divss %xmm1, %xmm0
    cvtss2sd %xmm0, %xmm0
    leaq .LC45(%rip), %rdi
    movl $1, %eax
    call printf
    movl -8(%rbp) /* month */, %eax
    incl %eax
    movl %eax, -8(%rbp) /* month */
.L6:
    movl -8(%rbp) /* month */, %eax
    cmpl $12, %eax
    jl .L5

    movq $10, %rdi
    call putchar

    movl $0, %eax
    movq %rbp, %rsp
    popq %rbp
    ret